<script>
  function Foo () {
    getName = function () {
      console.log(100)
    }
    return this
  }

  Foo.getName = function () {
    console.log(20)
  }

  Foo.prototype.getName = function () {
    console.log(30)
  }

  // 函数提升，先声明var getName =null，赋值在后
  var getName = function () {
    console.log(40)
  }

  function getName () {
    console.log(50)
  }


  // Foo是函数，函数也是对象。所以这里是对象的属性。所以打印20
  Foo.getName()

  //声明式函数赋值在后，覆盖。故40
  getName()
  //相当于window.Foo().getName,所以Foo返回this,是window,故window.getName.且内部getName再次被赋值。故100
  Foo().getName()
  //同上，100
  getName()
  //逗我？20
  Foo.getName()
  //.优先级高，从左往右执行，new比函数调用优先级高。所以实例的属性，故30
  new Foo().getName()


//打印结果20，40，100，100，20，30
</script>